import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'

// axios实例配置
const service = axios.create({
  // 设置请求基地址 url = baseUrl + requestUrl
  baseURL: process.env.VUE_APP_BASE_API,
  // 设置请求超时时间
  timeout: 5000
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    const token = store.getters.token
    if (token) {
      // 从store中获取到token并携带在请求头Authorization中
      config.headers['Authorization'] = 'Bearer ' + token
    }

    return config
  },
  error => {
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    const { code, message, data, total, records } = response.data

    if (code === 401 || code === 403) {
      Message.warning(message)
      store.dispatch('user/resetToken').then(() => {
        location.reload()
      })
      return Promise.reject(new Error(message))
    }

    if (code !== 200) {
      Message.error(message)
      return Promise.reject(new Error(message))
    }

    return total !== undefined && records !== undefined ? { total, records } : data
  },
  error => {
    if (error.response) {
      Message.error(error.response.data.message || error.message)
    } else if (error.request) {
      // 由于网络问题或其他原因请求未能到达服务器error.request将会是undefined
      Message.error('网络异常，请稍后重试')
    } else {
      Message.error('服务器异常，请稍后重试')
    }

    return Promise.reject(error)
  }
)

export default service
